package com.changgou.canal;

import com.alibaba.fastjson.JSON;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.changgou.content.feign.ContentFeign;
import com.changgou.content.pojo.Content;
import com.xpand.starter.canal.annotation.*;
import entity.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * @auther LiZiBa
 * @date 2020/10/24 22:09
 * @description: canal监听实现
 **/

@CanalEventListener
public class CanalDateEventListener {


    @Autowired
    private ContentFeign contentFeign;
    //字符串
    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    /**
     * 监听数据库数据插入后的变化 -- 后处理
     * @param entryType    数据库操作名称
     * @param rowData      数据库行数据
     */
//    @InsertListenPoint
//    public void onEventInsert(CanalEntry.EntryType entryType, CanalEntry.RowData rowData) {
//
//        rowData.getAfterColumnsList().forEach((r) ->{
//
//            System.out.println("By--Annotation: " + r.getName() + "::" + r.getValue());
//         });
//    }


    /**
     * 数据库更新操作监听
     * @param rowData
     */
//    @UpdateListenPoint
//    public void onEventUpdate(CanalEntry.RowData rowData) {
//
//        rowData.getAfterColumnsList().forEach((r) ->{
//
//            System.out.println("By--Annotation: " + r.getName() + "::" + r.getValue());
//        });
//    }


    /**
     * 删除数据库监听操作
     * @param rowData
     */
//    @DeleteListenPoint
//    public void onEventDelete(CanalEntry.RowData rowData) {
//        rowData.getAfterColumnsList().forEach((r) ->{
//
//            System.out.println("By--Annotation: " + r.getName() + "::" + r.getValue());
//        });
//    }


    /**
     * 自定义数据库操作
     * @param eventType
     * @param rowData
     */
    @ListenPoint(

            // 数据库名称
            schema = {"changgou_content"},
            // 表名称
            table = {"tb_content_category", "tb_content"},
            // 数据库操作名称，增删改推送到redis缓存中记录
            eventType = {CanalEntry.EventType.UPDATE, CanalEntry.EventType.DELETE, CanalEntry.EventType.INSERT}

    )
    public void onEventCustomUpdate(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {

        rowData.getAfterColumnsList().forEach((r) ->{
            // 1.获取列名 为category_id的值
            String category_id = getColumnValue(eventType, rowData);
            if(!StringUtils.isEmpty(category_id)) {
                // 2.调用feign 获取该分类下的所有的广告集合
                Result<List<Content>> categories = contentFeign.findByCategory(Long.parseLong(category_id));

                if(categories != null){
                    // 3.使用redisTemplate存储到redis中
                    stringRedisTemplate.boundValueOps("content_" + category_id).set(JSON.toJSONString(categories.getData()));
                }
            }
            System.out.println("By--Annotation: " + r.getName() + "::" + r.getValue());
        });

    }


    /**
     * 获取列名
     * @param eventType
     * @param rowData
     * @return
     */
    private String getColumnValue(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        String category_id = "";
        //判断 如果是删除  则获取beforlist
        if(eventType == CanalEntry.EventType.DELETE) {
            for (CanalEntry.Column column : rowData.getBeforeColumnsList()) {
               if(column.getName().equalsIgnoreCase("category_id")) {
                   category_id = column.getValue();
                   return category_id;
               }
            }
        }else {
            //判断 如果是添加 或者是更新 获取afterlist
            for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
                if (column.getName().equalsIgnoreCase("category_id")) {
                    category_id = column.getValue();
                    return category_id;
                }
            }
        }


        return category_id;
    }
}
